// Go作者版权所有。版权所有。
// 此源代码的使用受BSD样式的约束
// 可以在许可证文件中找到的许可证。

package sha1

import "internal/cpu"

// 围棋：noescape
func blockAVX2(dig *digest, p []byte)

// 围棋：noescape
func blockAMD64(dig *digest, p []byte)

var useAVX2 = cpu.X86.HasAVX2 && cpu.X86.HasBMI1 && cpu.X86.HasBMI2

func block(dig *digest, p []byte) {
	if useAVX2 && len(p) >= 256 {
		// blockAVX2为每次迭代计算2个块的sha1
		// 它还交叉进行下一块的预计算。
		// 所以，它可以读取超过p结尾的192字节
		// 我们可以在blockAVX2中添加检查，但这将
		// 只需将其转换为blockAMD64的副本，
		// 所以直接打电话吧。
		safeLen := len(p) - 128
		if safeLen%128 != 0 {
			safeLen -= 64
		}
		blockAVX2(dig, p[:safeLen])
		blockAMD64(dig, p[safeLen:])
	} else {
		blockAMD64(dig, p)
	}
}
